//=====================================================================
//
//
//
//=====================================================================
#ifndef KALEIDOSCOPE_SCOPE_HPP
#define KALEIDOSCOPE_SCOPE_HPP
//=====================================================================
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
//=====================================================================
#include <sooty/frontend/syntactic_analysis/parseme.hpp>
//=====================================================================
#include <kaleidoscope/kaleidoscope.hpp>
#include <kaleidoscope/common/symbol_ids.hpp>
#include <kaleidoscope/frontend/syntactical_analysis/marshall.hpp>
#include <kaleidoscope/frontend/semantic_analysis/resolve.hpp>
//=====================================================================
#include <kaleidoscope/frontend/semantic_analysis/scope_algorithm.hpp>
//=====================================================================
KALEIDOSCOPE_BEGIN
//=====================================================================
	
	
	//=====================================================================
	// compares a functions against a function-call
	//=====================================================================
	namespace scope
	{
		struct function_matches_call
		{
			function_matches_call(atma::sooty::const_parseme_ptr_ref call);
			bool operator ()(atma::sooty::const_parseme_ptr_ref candidate);
		private:
			atma::sooty::parseme_ptr call_;
		};
	}
	
	
	//=====================================================================
	// compares functions against a function (always exact typings)
	//=====================================================================
	namespace scope
	{
		struct other_functions_matching
		{
			other_functions_matching(atma::sooty::const_parseme_ptr_ref function);
			bool operator ()(atma::sooty::const_parseme_ptr_ref candidate);
		private:
			atma::sooty::parseme_ptr function_;
		};
	}
	
	//=====================================================================
	// determines if the types of the two nodes match
	//=====================================================================
	namespace scope
	{
		bool types_match(atma::sooty::const_parseme_ptr_ref, atma::sooty::const_parseme_ptr_ref);
	}
	
//=====================================================================
KALEIDOSCOPE_CLOSE
//=====================================================================
#endif
//=====================================================================
